#ifndef TOOL_REQUEST_CREATOR_IMPL_H_
#define TOOL_REQUEST_CREATOR_IMPL_H_
// Copyright (C) 2018 Chen XiaWen sup9@qq.com
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include <curl/curl.h>
#include <memory.h>
// #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#include <list>
#include <memory>
#include <mutex>
#include <string>

#include "tool/request_creator.h"

using std::string;

struct initurl {
  string url;
  CURLSH* share = nullptr;
  int threadno = 0;
};

struct MemoryStruct {
  MemoryStruct() {}
  ~MemoryStruct() {
    if (memory != nullptr) {
      delete[] memory;
      memory = nullptr;
      size = 0;
    }
  }
  char* memory = nullptr;
  size_t size = 0;
};

class RequestCreatorImpl : public RequestCreator {
 public:
  std::string get_resource() override;
  bool HttpGet(const char* url) override;
  RequestCreatorImpl(/* args */);
  ~RequestCreatorImpl();

 private:
  void InitLock();
  void KillLock();
  std::mutex curl_mutex_;
  CURLSH* share_ = nullptr;
  std::list<initurl> list_urls_;
  std::shared_ptr<MemoryStruct> p_chunk_;
};

#endif  // TOOL_REQUEST_CREATOR_IMPL_H_
